#ifndef __MENU_MONO_H__
#define __MENU_MONO_H__

#include "Number_edit.h"

#define MENU_MONO_COLUMN_N DISP_COLUMN_N
#define MENU_MONO_LINE_N DISP_LINE_N

#define CUR_SEL_NULL 0xff
#define CHAR_NOPER 0x01




enum{
	DISP_LAYER_BASIC,		//基本层
	DISP_LAYER_SEL,			//选择变量层
	DISP_LAYER_EDIT,		//编辑层
	//DISP_LAYER_PASSWORD,	//密码层
};

enum{
	LOCK_LEVEL_LOCK,
	LOCK_LEVEL_UNLOCK,
};

#define MENU_PASSWORD 0xff
#define PASSWORD_UNLOCK_TIMEDOUT 60000				//密码输入1分钟后超时
typedef struct{
	unsigned char layer;			//层 0：基本显示层 1：高亮选择层 2：变量编辑层 3：密码层
	unsigned char cur_menu;			//当前菜单
	unsigned char last_menu;		//上一菜单
	unsigned char cur_page;			//当前页
	unsigned char last_page;		//上一页
	unsigned char cur_comp;			//当前显示元件
	unsigned char comp_n;			//当前页元件数
	unsigned char menu_n;			//菜单总数
	unsigned char page_n;			//页总数
	unsigned char cur_sel;			//当前选择元件
	unsigned char lock_level;		//锁定等级 0：不能编辑，1：可以编辑
	unsigned char menu_reset;		//动态页面更新后系要重新计算页面的元件数，并切换到当前菜单的第0页
	time_ms_T lock_tm;				//密码有效时间
	unsigned int psd_buf;			//密码缓存
	unsigned int *p_userpsd;		//指向用户密码
	unsigned int super_psd;			//超级密码
	NUMBER_EDIT_T edit;				//编辑变量
	const void ****menus;			//指向菜单列表
	const void ***pages;			//指向页面列表
	const void **page;				//指向当前页面
	const void ***pages_password;	//指向密码页面,如果为NULL表示不需要密码
	char *disp_buf;					//显示缓存，存放ASC码
	unsigned char *dot_buf;			//点阵缓存，用于写BMP
}MENU_MONO_T;




//=====================================================================================
//V106,增加进度条元件

//暂时不需预留单元，如果结构体有改变，可以通过升级固件达到编译软件与固件保持一致

#define	ADR_NULL	0					//0代表无地址
typedef void * DATA_ADR_T;		//数据地址类型为长整型
//-------------------------------------------------

//-------------------------------------------------

//***************************************************************************//
//-------------------------------------------------------------------------
//                              变量属性
//-------------------------------------------------------------------------
//| 15 | 14 | 13 |  12  | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
//|                                                       |    变量属性   |
//-------------------------------------------------------------------------
//变量属性定义
//Bit 0-3表示变量类型
#define VTP_TYPE_MASK	0x0f//变量类型屏蔽字

//变量类型枚举
enum{
	VTP_BIT,			//位变量
	VTP_S8,			//有符号字节
	VTP_U8,			//无符号字节
	VTP_S16,			//有符号短整
	VTP_U16,		//无符号短整
	VTP_S32,			//有符号长整
	VTP_U32,			//无符号长整
	VTP_FLOAT,			//浮点数
};

#define m_VTP(A) (A & VTP_TYPE_MASK)

typedef union{
	unsigned long ul;
	long l;
	float f;
}MENU_MONO_DATA_T;
//***************************************************************************//
//-------------------------------------------------------------------------
//                              显示属性
//-------------------------------------------------------------------------
//| 15 | 14 |   13  |  12  | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
//|符号|    |*号显示|无效零|     显示模式    |    整数位数   |    小数位数   |
//-------------------------------------------------------------------------


//显示属性定义
//BIT0-3显示小数位数
//BIT4-7显示整数位数
//BIT8-11显示模式
//BIT12无效零显示选项
#define DPP_DEC_MASK		0x0f	//小数位数屏蔽字
#define DDP_DEC_SHIEH		0		//左移0位

#define DPP_INT_MASK		0x0f	//整数位数屏蔽字
#define DDP_INT_SHIFT		4		//移4位


#define DDP_DISP_MODE_MASK	0x0f	//显示模式屏蔽字
#define DDP_DISP_MODE_SHIFT		8		//移8位
#define M_DDP_DISP_MODE(M)	(M<<DDP_DISP_MODE_R)
enum{
	DDP_DISP_MODE_DEC,		//十进制显示
	DDP_DISP_MODE_BCD,		//BCD码显示
	DDP_DISP_MODE_HEX,		//十六进制显示
	DDP_DISP_MODE_BIN		//二进制显示
};


#define DDP_INV0	(1<<12)			//无效零显示
#define DDP_INV0_DIS	0			//无效零不显示

#define DDP_STAR	(1<<13)			//*号显示

#define DDP_SIGN	(1<<15)			//有符号显示
#define DDP_nSIGN	(0)				//无符号显示

#define m_DP_DEC_NB(A)		(A&DPP_DEC_MASK)
#define m_DP_INT_NB(A)		((A>>DDP_INT_SHIFT)&DPP_DEC_MASK)
#define IS_DP_SIGN(A)	((A & DDP_SIGN) !=0)
#define IS_DP_INV0(A)	((A & DDP_INV0) !=0)
#define IS_DP_STAR(A)	((A & DDP_STAR) !=0)

#define M_DDP_DISP(S,T,I,M,N,D)	((T<<13)|(S<<15)|(I<<12)|(M<<8)|(N<<4)|D)

#define DTP_UD(N)	M_DDP_DISP(0,0,0,0,N,0)	//整形无符号数
#define DTP_ZUD(N)	M_DDP_DISP(0,0,1,0,N,0)	//整形无符号数,显示无效0
#define DTP_D(N)	M_DDP_DISP(1,0,0,0,N,0)	//整形有符号数
#define DTP_ZD(N)	M_DDP_DISP(1,0,1,0,N,0)	//整形有符号数,显示无效0

#define DTP_PUD(N,D)	M_DDP_DISP(0,0,0,0,N,D)	//定点整形无符号数
#define DTP_ZPUD(N,D)	M_DDP_DISP(0,0,1,0,N,D)	//定点整形无符号数，显示无效零
#define DTP_PD(N,D)		M_DDP_DISP(1,0,0,0,N,D)	//定点整形有符号数
#define DTP_ZPD(N,D)	M_DDP_DISP(1,0,1,0,N,D)	//定点整形有符号数，显示无效零

#define DTP_STAR(N)	M_DDP_DISP(0,1,1,0,N,0)	//整形无符号数,显示无效0,*号代替

//***************************************************************************//
//控制枚举
enum
{
	DISP_CTRL_NML,		//正常显示
	DISP_CTRL_REV,		//反白显示
	DISP_CTRL_FLASH,	//闪烁	
	DISP_CTRL_DISABLE,	//不显示
};
typedef unsigned long COMP_CTRL_T;
//***************************************************************************//
//元件类型枚举
enum{
	CTP_NULL,			//空元件
	CTP_TXT,		//静态文字
	CTP_DATA_DISP,		//数值显示元件
	CTP_TXT_DATA_DISP,	//文数对应显示元件
	CTP_DATA_SET,		//数值设定元件
	CTP_TXT_DATA_SET,	//文数对应设定元件
	CTP_BMP,			//位图
};
//-----------------------------------------------------------------------------
//静态文字结构体
typedef struct 
{
	unsigned long type;		//元件类型,每个元件描述的第一个字节就是元件属性
	char * p_txt;			//字符串地址
	COMP_CTRL_T ctrl;	    //控制信号指针，=NULL，无控制正常显示
	unsigned short x;		//元件X坐标
	unsigned short y;		//元件Y坐标
	unsigned short bytes;	//显示字符数
}MENU_TXT_T;

#define m_TXT(NAME,S,CTRL,Y,X) const MENU_TXT_T NAME={CTP_TXT,S,CTRL,X,Y,sizeof(S)-1}
#define m_TXT_ACT(NAME,S,CTRL,Y,X)  MENU_TXT_T NAME={CTP_TXT,S,CTRL,X,Y,sizeof(S)-1}
//-----------------------------------------------------------------------------
//数值显示元件结构体
typedef struct
{
	unsigned long type;				//元件类型,每个元件描述的第一个字节就是元件属性
	DATA_ADR_T adr;					//变量地址
	COMP_CTRL_T ctrl;	    		//控制信号指针
	unsigned short x;				//元件X坐标
	unsigned short y;				//元件Y坐标
	unsigned short var_property;	//变量属性
	unsigned short disp_property;	//显示属性
} MENU_DATA_DISP_T;

#define m_DATA_DISP(NAME,ADR,CTRL,Y,X,VP,DP) const MENU_DATA_DISP_T NAME={CTP_DATA_DISP,ADR,CTRL,X,Y,VP,DP}
//-----------------------------------------------------------------------------
//文数值显示元件结构体		//V106
typedef struct
{
	unsigned long type;		//元件类型,每个元件描述的第一个字节就是元件属性
	DATA_ADR_T adr;			//读取地址
	COMP_CTRL_T ctrl;	    		//控制信号指针
	unsigned short x;			//元件X坐标
	unsigned short y;			//元件Y坐标
	unsigned short var_property;	//变量属性(表5-1)
	unsigned short size_x;		//元件X尺寸
	char ** txt_index;				//字符串索引表
	unsigned short index_n;			//字符串条目数
}MENU_TXT_DATA_DISP_T;

#define m_TXT_DATA_DISP(NAME,ADR,CTRL,Y,X,SIZE,INDEX) const MENU_TXT_DATA_DISP_T NAME={CTP_TXT_DATA_DISP,ADR,CTRL,X,Y,VTP_U8,SIZE,(char **)INDEX,countof(INDEX)}
//-----------------------------------------------------------------------------
//文数值设定元件结构体		//V106
typedef struct
{
	unsigned long type;		//元件类型,每个元件描述的第一个字节就是元件属性
	DATA_ADR_T rd_adr;			//读取地址
	COMP_CTRL_T ctrl;	    		//控制信号指针
	unsigned short x;			//元件X坐标
	unsigned short y;			//元件Y坐标
	unsigned short var_property;	//变量属性(表5-1)
	unsigned short size_x;		//元件X尺寸
	char ** txt_index;				//字符串索引表
	unsigned short index_n;			//字符串条目数
	DATA_ADR_T wr_adr;			//读取地址
}MENU_TXT_DATA_SET_T;
#define m_TXT_DATA_SET(NAME,ADR,CTRL,Y,X,SIZE,INDEX,WADR) const MENU_TXT_DATA_SET_T NAME={CTP_TXT_DATA_SET,ADR,CTRL,X,Y,VTP_U8,SIZE,(char **)INDEX,countof(INDEX),WADR}
//-----------------------------------------------------------------------------
//数值设定结构体
typedef struct
{
	unsigned long type;			//元件类型,每个元件描述的第一个字节就是元件属性
	DATA_ADR_T rd_adr;
	COMP_CTRL_T ctrl;	    		//控制信号指针
	unsigned short x;				//元件X坐标
	unsigned short y;				//元件Y坐标
	unsigned short var_property;	//变量属性(表5-1)
	unsigned short disp_property;	//显示属性(表5-2)
	DATA_ADR_T wr_adr;
	long min;
	long max;
}MENU_DATA_SET_T;

#define m_DATA_SET(NAME,ADR,CTRL,Y,X,VP,DP,WADR,MIN,MAX) const MENU_DATA_SET_T NAME={CTP_DATA_SET,ADR,CTRL,X,Y,VP,DP,WADR,MIN,MAX}
//----------------------------------------------------------------------------
typedef struct
{
	unsigned long type;				//元件类型,每个元件描述的第一个字节就是元件属性
	DATA_ADR_T rd_adr;				//指向BMP图
	COMP_CTRL_T ctrl;	    		//控制信号指针
	unsigned short x;				//元件X坐标，字符坐标
	unsigned short y;				//元件Y坐标，行字符坐标
	unsigned short x_size;			//元件X坐标，字符占位，一个字符宽8点阵
	unsigned short y_size;			//元件Y坐标，字符占位数，一个字符高16点阵
}MENU_BMP_T;
#define m_BMP(NAME,ADR,CTRL,Y,X,Y_SIZE,X_SIZE) const MENU_DATA_SET_T NAME={CTP_BMP,ADR,CTRL,X,Y,X_SIZE,Y_SIZE}

typedef union 		//类型指针联合体
{
	unsigned long type;
	MENU_TXT_T stxt;
	MENU_DATA_DISP_T data;
	MENU_DATA_SET_T data_set;
	MENU_TXT_DATA_DISP_T txt_data;
	MENU_TXT_DATA_SET_T txt_data_set;
	MENU_BMP_T bmp;
}U_COPONENT_T;

//动态元件的信息结构
void Menu_Mono_DispComponent(MENU_MONO_T *p,void *comp);
void Menu_Mono_NewMenu(MENU_MONO_T *p,unsigned char newmenu,unsigned char newpage);
void Menu_Mono_NextMenu(MENU_MONO_T *p);
void Menu_Mono_PrevMenu(MENU_MONO_T *p);
void Menu_Mono_NewPage(MENU_MONO_T *p,unsigned char newpage);
void Menu_Mono_DispPage(MENU_MONO_T *p);
void Menu_Mono_NextPage(MENU_MONO_T *p);
void Menu_Mono_PrevPage(MENU_MONO_T *p);
unsigned char Menu_Mono_Basic(MENU_MONO_T *p,unsigned char key_code);
unsigned char Menu_Mono_Sel(MENU_MONO_T *p,unsigned char key_code);
unsigned char Menu_Mono_Edit(MENU_MONO_T *p,unsigned char key_code);
void Menu_Mono_NextLayer(MENU_MONO_T *p);
void Menu_Mono_PrevLayer(MENU_MONO_T *p);
void Menu_Mono_NextSel(MENU_MONO_T *p);
void Menu_Mono_PrevSel(MENU_MONO_T *p);
void Menu_Mono_Layer_BAsic(MENU_MONO_T *p);

#endif
